#ifndef REFLECT_H
#define REFLECT_H
#include <QString>
#include <QMetaObject>
#include <QHash>
#include <QWidget>
/**
 * @brief Reflect 根据类名反射对象
 */
class WidgetReflect
{
public:
    typedef QWidget* (*Constructor)(QWidget* parent);
    /**
     * @brief registerClass 注册类型
     */
    template<typename T>
    static Constructor registerClass()
    {
        Constructor constructor=&constructorHelper<T>;
        constructors().insert(T::staticMetaObject.className(),&constructorHelper<T>);
        return constructor;
    }
    /**
     * @brief newInstance 实例化对象
     * @param className 对象名称
     * @param parent  父级
     * @return 实例化的对象指针
     */
    static QWidget* newInstance(const QString& className,QWidget* parent =nullptr)
    {
        Constructor constructor=constructors().value(className);
        if(constructor==nullptr)
        {
            return nullptr;
        }
        return (*constructor)(parent);
    }
private:
    /**
     * @brief constructorHelper 创建对象函数
     * @param parent 父级
     * @return 创建的对象指针
     */
    template<typename T>
    static QWidget* constructorHelper(QWidget *parent)
    {
        return new T(parent);
    }
    /**
     * @brief constructors  获取创建对象函数哈希表
     * @return 返回创建对象函数哈希表
     */
    static QHash<QString,Constructor>& constructors()
    {
        static QHash<QString,Constructor> instance;
        return instance;
    }
};
#endif // REFLECT_H
